﻿using System.ServiceModel.Activation;
using CPN.PJN.Common.Logging;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace CPN.PJN.Service.Logging
{
    /// <summary>
    /// Cette classe correspond au contrat de service pour les logs
    /// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "LoggerService" in both code and config file together.
    /// </summary>
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class LoggerService : ILoggerService
    {
        #region Constants

        /// <summary>
        /// Nom de la section de configuration pour Unity
        /// </summary>
        private const string UNITY_SECTION_NAME = "unity";

        /// <summary>
        /// Nom du Container pour la configuration pour Unity
        /// </summary>
        private const string UNITY_CONTAINER_NAME = "LoggerServiceContainer";

        #endregion

        #region Container Property

        /// <summary>
        /// Container IoC Unity
        /// </summary>
        private IUnityContainer container;

        /// <summary>
        /// Container IoC Unity
        /// </summary>
        public IUnityContainer Container
        {
            get
            {
                if (this.container == null)
                {
                    this.container = new UnityContainer();
                }
                return this.container;
            }
        }

        #endregion
        
        #region Constructors

		/// <summary>
		/// Constructeur par défaut
		/// </summary>
		public LoggerService()
			: this(UNITY_CONTAINER_NAME)
		{
		}

		/// <summary>
		/// Constructeur par défaut
		/// </summary>
		/// <param name="containerName">Nom de la configuration du Container Unity</param>
        public LoggerService(string containerName)
		{
			UnityConfigurationSection section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection(UNITY_SECTION_NAME);
            section.Configure(this.Container, containerName);

            this.InitializeLogger();
		}

		#endregion

        #region InitializeLogger

        /// <summary>
        /// Cette méthode permet d'initialiser le logger par configuration unity
        /// </summary>
        private void InitializeLogger()
        {
            Logger.Instance.Initialize(this.container.Resolve<ILogWriter>());
        }

        #endregion

        #region Write Methods

        /// <summary>
        /// Cette méthode écrit le message de log
        /// </summary>
        /// <param name="message">Message de log</param>
        public void Write(string message)
        {
            Logger.Instance.Write(message);
        }
        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        public void WriteWithCategory(string message, string category)
        {
            Logger.Instance.Write(message, category);
        }
        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa Sévérité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">Sévérité</param>
        public void WriteWithSeverity(string message, string category, int severity)
        {
            Logger.Instance.Write(message, category, severity);
        }

        #endregion
    }
}
